/** * InstallationPageService * Copyright 05.08.2015 by Robert Mader, @treba13 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package org.loklak.api.cms; import org.json.JSONObject; import org.loklak.LoklakEmailHandler; import org.loklak.LoklakInstallation; import org.loklak.data.DAO; import org.loklak.server.*; import org.loklak.tools.storage.JSONObjectWithDefault; import javax.mail.AuthenticationFailedException; import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; import java.util.regex.Pattern; public class InstallationPageService extends AbstractAPIHandler implements APIHandler { private static final long serialVersionUID = 8678478303032749879L; private static final String customConfigPath = "data/settings/customized_config.properties"; @Override public BaseUserRole getMinimalBaseUserRole() { return BaseUserRole.ANONYMOUS; } @Override public JSONObject getDefaultPermissions(BaseUserRole baseUserRole) { return null; } @Override public String getAPIPath() { return "/api/installation.json"; } @Override public JSONObject serviceImpl(Query post, HttpServletResponse response, Authorization authorization, final JSONObjectWithDefault permissions) throws APIException { JSONObject result = new JSONObject(); if(post.get("finish", false)){ LoklakInstallation.shutdown(0); return null; } if(post.get("abort", false)){ LoklakInstallation.shutdown(1); return null; } if(post.get("checkSmtpCredentials", false)){ String smtpHostName = post.get("smtpHostName", null); String smtpUsername = post.get("smtpUsername", null); String smtpPassword = post.get("smtpPassword", null); String smtpHostEncryption = post.get("smtpHostEncryption", null); int smtpHostPort = post.get("smtpHostPort", 0); boolean smtpDisableCertificateChecking = post.get("smtpDisableCertificateChecking", false); if(smtpHostName == null|| smtpHostEncryption == null || smtpUsername == null || smtpPassword == null){ throw new APIException(400, "Bad request"); } try { LoklakEmailHandler.checkConnection(smtpHostName, smtpUsername, smtpPassword, smtpHostEncryption, smtpHostPort, smtpDisableCertificateChecking); return result; } catch (AuthenticationFailedException e) { throw new APIException(422, e.getMessage()); } catch (Throwable e){ throw new APIException(400, e.getMessage()); } } // read from file Properties properties = new Properties(); try { BufferedInputStream stream = new BufferedInputStream(new FileInputStream(customConfigPath)); properties.load(stream); stream.close(); } catch (Exception e){ throw new APIException(500, "Server error"); } // admin String adminEmail = post.get("adminEmail", null); String adminPassword = post.get("adminPassword", null); if(adminEmail != null && adminPassword != null){ // check email pattern Pattern pattern = Pattern.compile(LoklakEmailHandler.EMAIL_PATTERN); if (!pattern.matcher(adminEmail).matches()) { throw new APIException(400, "no valid email address"); } // check password pattern pattern = Pattern.compile("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,64}$"); if (adminEmail.equals(adminPassword) || !pattern.matcher(adminPassword).matches()) { throw new APIException(400, "invalid password"); } // check if id exists already ClientCredential credential = new ClientCredential(ClientCredential.Type.passwd_login, adminEmail); Authentication authentication = new Authentication(credential, DAO.authentication); if (authentication.getIdentity() != null) { throw new APIException(422, "email already taken"); } // create new id ClientIdentity identity = new ClientIdentity(ClientIdentity.Type.email, credential.getName()); authentication.setIdentity(identity); // set authentication details String salt = createRandomString(20); authentication.put("salt", salt); authentication.put("passwordHash", getHash(adminPassword, salt)); authentication.put("activated", true); // set authorization details Authorization adminAuthorization = new Authorization(identity, DAO.authorization, DAO.userRoles); adminAuthorization.setUserRole(DAO.userRoles.getDefaultUserRole(BaseUserRole.ADMIN)); result.put("admin_email", adminEmail); } String adminLocalOnly = post.get("adminLocalOnly", null); if("true".equals(adminLocalOnly) || "false".equals(adminLocalOnly)) properties.setProperty("users.admin.localonly", adminLocalOnly); // peername String peerName = post.get("peername", null); if(peerName != null) properties.setProperty("peername", peerName); // backend String backendPushEnabled = post.get("backendPushEnabled", null); if("true".equals(backendPushEnabled) || "false".equals(backendPushEnabled)) properties.setProperty("backend.push.enabled", backendPushEnabled); String backend = post.get("backend", null); if(backend != null) properties.setProperty("backend", backend); // cert checking String trustSelfSignedCerts = post.get("trustSelfSignedCerts", null); if(trustSelfSignedCerts != null) properties.setProperty("httpsclient.trustselfsignedcerts", trustSelfSignedCerts); // https setting String httpsMode = post.get("httpsMode", null); if(httpsMode != null) properties.setProperty("https.mode", httpsMode); String httpsKeySource = post.get("httpsKeySource", null); if(httpsKeySource != null) properties.setProperty("https.keysource", httpsKeySource); String httpsKeystore = post.get("httpsKeystore", null); if(httpsKeystore != null) properties.setProperty("keystore.name", httpsKeystore); String httpsKeystorePassword = post.get("httpsKeystorePassword", null); if(httpsKeystorePassword != null) properties.setProperty("keystore.password", httpsKeystorePassword); String httpsKey = post.get("httpsKey", null); if(httpsKey != null) properties.setProperty("https.key", httpsKey); String httpsCert = post.get("httpsCert", null); if(httpsCert != null) properties.setProperty("https.cert", httpsCert); // smtp String smtpEnabled = post.get("smtpEnabled", null); if("true".equals(smtpEnabled) || "false".equals(smtpEnabled)) properties.setProperty("smtp.mails.enabled", smtpEnabled); String smtpHostName = post.get("smtpHostName", null); if(smtpHostName != null) properties.setProperty("smtp.host.name", smtpHostName); Integer smtpHostPort = post.get("smtpHostPort", 0); if(smtpHostPort > 0 && smtpHostPort < 65535) properties.setProperty("smtp.host.port", smtpHostPort.toString()); String smtpHostEncryption = post.get("smtpHostEncryption", null); if("none".equals(smtpHostEncryption) || "tls".equals(smtpHostEncryption) || "starttls".equals(smtpHostEncryption)) properties.setProperty("smtp.host.encryption", smtpHostEncryption); String smtpEmail = post.get("smtpEmail", null); if(smtpEmail != null) properties.setProperty("smtp.sender.email", smtpEmail); String smtpDisplayname = post.get("smtpDisplayname", null); if(smtpDisplayname != null) properties.setProperty("smtp.sender.displayname", smtpDisplayname); String smtpUsername = post.get("smtpUsername", null); if(smtpUsername != null) properties.setProperty("smtp.sender.username", smtpUsername); String smtpPassword = post.get("smtpPassword", null); if(smtpPassword != null) properties.setProperty("smtp.sender.password", smtpPassword); String smtpDisableCertificateChecking = post.get("smtpDisableCertificateChecking", null); if("true".equals(smtpDisableCertificateChecking) || "false".equals(smtpDisableCertificateChecking)) properties.setProperty("smtp.trustselfsignedcerts", smtpDisableCertificateChecking); // host url String hostUrl = post.get("hostUrl", null); if(hostUrl != null) properties.setProperty("host.url", hostUrl); String shortLinkStub = post.get("shortLinkStub", null); if(shortLinkStub != null) properties.setProperty("shortlink.urlstub", shortLinkStub); // user signup String publicSignup = post.get("publicSignup", null); if(publicSignup != null) properties.setProperty("users.public.signup", publicSignup); // write to file try{ FileOutputStream stream = new FileOutputStream(customConfigPath); properties.store(stream, "This file can be used to customize the configuration file conf/config.properties"); stream.close(); } catch (Exception e){ throw new APIException(500, "Server error"); } return result; } }